package main

import (
	"errors"
	"fmt"
)

// panic 意味着有些出乎意料的错误发生。通常我们用它来表示程序正常运行中不应该出现的，或者我们没有处理好的错误。
// 类比 java 的 throw exception(java throw只会中断执行的线程，而go panic是整个程序终止运行)
func main() {

	// panic 的一个基本用法就是在一个函数返回了错误值但是我们并不知道（或者不想）处理时终止运行
	go func() {
		_, err := division(10, 0)
		if err != nil {
			// panic，输出一个错误消息 和 Go 调用方法栈信息，并且返回一个非零的状态码（Process finished with the exit code 2）
			panic(err) // 并不只是终止当前的 go 协程，是会终止整个程序
		}
	}()

	var input string
	// 这里的 fmt.Scanln 需要我们在程序退出前按下任意键（为了保证 Go 协程执行完毕）
	_, err := fmt.Scanln(&input)
	if err != nil {
		return
	}
	fmt.Println("done")

}

func division(a, b int) (int, error) {
	if b == 0 {
		return 0, errors.New("除数不能为0")
	}
	return a / b, nil
}
